#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;
//写一个结构体，定义了一个键值对，也就是单词和出现频率
//然后之后的序列式容器就用vector来解决
struct record {
    record(string word,int frequent)
    :_word(word)
    ,_frequent(frequent)
    {

    }
    string _word;
    int _frequent;
};

class Dictionary{
public:
    Dictionary(int volumn)
    {
        //提前让这个容器预留volumn个空间的容量
        _dict.reserve(volumn);
    }
    //先去读取文件
    void read(const string & filename){
        ifstream ifs(filename);
        if(!ifs){
        return;
        }
        //但这里就是成功打开了文件，可以开始读取操作
        string line;
        //一行一行的读，读出来的每一行都放到line里面
        while(getline(ifs,line)){
            //创建一个字符串输入流对象iss,以从ifs读到的每一行为参数
            istringstream iss(line);
            //新建一个字符串，把line里面的每一个单词单独拿出来
            string word;
            while(iss>>word){
                //判断是不是纯字母
                if(is_alpha(word)){
                    int i=0;
                    //在vector容器里面进行一个一个的遍历，一个一个单词比
                    for(;i<_dict.size();++i){
                        //如果发现这个单词跟_dict里面的任意一个单词一样，那就直接频率加1
                        if(word==_dict[i]._word){
                            ++_dict[i]._frequent;
                            break;
                        }
                    }
                    //如果遍历到最后一个都没能把这个单词找到，那就把这个单词记录下来，频率设为1
                    if(i==_dict.size()){
                        _dict.push_back(record(word,1));
                    }
                }
            }
        }
    }
    void store(const string & filename){
        ofstream ofs(filename);
        for(auto &ele:_dict){
            ofs<<ele._word<<" "<<ele._frequent<<endl;
        }
        ofs.close();
    }

private:
    bool is_alpha(const string&word){
        auto it1=word.begin();
        auto it2=word.end();

        while(it1!=it2){
            if(!isalpha(*it1)){
                return false;
            }
            ++it1;
        }
        return true;
    }


    vector<record> _dict;
};

void test(){
    Dictionary dic(25000);
    dic.read("The_Holy_Bible.txt");
    dic.store("1.txt");
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

